Skip to main content

Module 5: Branches, Merges, and Conflicts

A branch gives a piece of work its own version path. You can make changes safely on a feature branch, then merge it into main after it is complete and verified.

What problems do branches solve?

  • A new feature is incomplete and should not affect the stable version.
  • Multiple people need to develop different features at the same time.
  • A production issue needs an urgent fix.
  • You want to experiment and keep the work only if it succeeds.

Step 1: Check the current branch

Enter the practice repository:

cd ~/git-projects/git-practice-remote
git status
git branch

The * marks your current branch. You can also print only its name:

git branch --show-current

Make sure the working tree is clean before continuing. If it contains changes, commit them or save them appropriately before starting this exercise.

Step 2: Create and switch to a feature branch

git switch -c feature/greeting

This command performs two actions:

  1. Creates feature/greeting from the current version.
  2. Switches to the new branch.

Verify your location:

git branch --show-current

Older tutorials often use git checkout -b feature/greeting. It has a similar effect, but git switch -c expresses the intent more clearly for beginners.

Step 3: Create a version on the feature branch

echo "Hello from the feature branch." > greeting.txt
git add greeting.txt
git commit -m "feat: add greeting"

Push the new branch to GitHub:

git push -u origin feature/greeting

Step 4: Merge the feature into Main

Switch to the branch that should receive the changes, then run merge:

git switch main
git merge feature/greeting

Inspect the result:

git log --oneline --graph --decorate --all
git status

After a successful merge, push it:

git push
Merge direction

To merge feature/greeting into main, first stand on main, then run git merge feature/greeting.

Fast-forward and merge commits

  • Fast-forward: main has no new commits since the feature branch was created, so Git only moves the branch pointer forward.
  • Merge commit: both branches have moved forward, so Git creates a new commit connecting their histories.

Both can be normal results. You do not need to repeat the operation just to produce one type or the other.

Step 5: Create and resolve a conflict

A conflict usually happens when two branches change the same part of the same file and Git cannot decide which result is correct.

5-1 Create a common starting point

First, create a file on main:

git switch main
echo "color=blue" > settings.txt
git add settings.txt
git commit -m "chore: add color setting"

Create a feature branch from that point:

git switch -c feature/change-color
echo "color=red" > settings.txt
git add settings.txt
git commit -m "feat: use red color"

5-2 Change the same line on Main

git switch main
echo "color=green" > settings.txt
git add settings.txt
git commit -m "fix: use green color"

5-3 Attempt the merge

git merge feature/change-color

Git should report a conflict. Inspect the state:

git status

settings.txt will contain markers similar to these:

 <<<<<<< HEAD
color=green
=======
color=red
>>>>>>> feature/change-color
  • The HEAD side represents the current main branch.
  • The section below the separator comes from feature/change-color.
  • Git cannot decide the correct business result; a person must understand the requirement and choose it.

5-4 Edit the final result

Suppose the team decides to use purple. Edit the file so it contains only:

settings.txt
color=purple

Mark the conflict as resolved and complete the merge:

git add settings.txt
git status
git commit -m "merge: resolve color setting conflict"

Check for any remaining conflict markers:

git grep -n -e '<<<<<<<' -e '=======' -e '>>>>>>>'

No output means those markers were not found in files tracked by Git.

If you do not want to continue resolving the conflict

Before creating the merge commit, return to the state before the merge:

git merge --abort

Step 6: Delete completed branches

Make sure the work was merged and that you are no longer on the feature branch:

git switch main
git branch -d feature/greeting

Delete the remote branch:

git push origin --delete feature/greeting

-d refuses to delete an unmerged branch. If it fails, do not immediately replace it with -D. First verify whether the branch still contains commits you need to keep.

Common problems

Git refuses to switch branches

Uncommitted changes would usually be overwritten. First run:

git status
git diff

Then choose whether to commit the changes, place them in a stash, or restore them only when you are sure they are no longer needed.

You merged in the wrong direction

Do not push yet. Save the current messages and git status. If the merge is still in progress, use git merge --abort. If a merge commit has already been shared, it is usually reversed with git revert -m 1 <merge-commit-id>; -m 1 keeps the first parent as the mainline, so inspect the version graph and confirm the parent order first. Do not guess and run reset --hard.

Command reference

CommandPurpose
git switch -c <branch>Create and switch to a branch
git switch <branch>Switch branches
git merge <branch>Merge a branch into the current branch
git merge --abortCancel an unfinished merge
git branch -d <branch>Safely delete a merged local branch
git push origin --delete <branch>Delete a remote branch
git log --graph --all --onelineShow the version graph for all branches